#include <algorithm>
#include <iostream>
#include <thread>
#include <vector>

int main()
{
    /* 延时lambda表达式的用法 */
    std::vector<int> nums;
    int thread_sum = 0;

    /* 1. 定义了一个使用lambda表达式获取总和，使用引用捕获的方式*/
    /* 注意，lambda表达式捕获的范围是在定义的时候捕获，而不是每次调用的时候捕获 */
    /* 如下，捕获了数组nums，如果在后续nums中的值可能会修改，并且在修改之后还需要调用lambda表达式，则应该用引用捕获 */
    auto nums_sum = [&]() -> int {
        int sum = 0;
        for (const auto &num : nums) {
            sum += num;
        }
        return sum;
    };

    for (int i = 1; i <= 100; ++i) {
        nums.push_back(i);
    }

    /* 调用lambda函数遍历数组 */
    /* std::for_each需要包含头文件 <algorithm> */
    std::for_each(nums.cbegin(), nums.cend(), [](int n) { std::cout << n << std::endl; });
    std::cout << "nums的总和为:" << nums_sum() << std::endl;

    /* 修改nums的值 */
    std::for_each(nums.begin(), nums.end(), [](int &n) { n = 1; });
    /* 再次调用lambda函数计算总和 */
    std::cout << "nums的总和为:" << nums_sum() << std::endl;

    /* 2. 使用匿名函数作为线程的工作函数， 使用引用捕获的方式*/
    std::thread t1([&]() {
        for (const auto &num : nums) {
            thread_sum += num;
        }
    });

    t1.join();
    std::cout << "thread_sum: " << thread_sum << std::endl;

    return 0;
}
